package Thread.Thread_Attributes;

public class Demo12 {
    //不能定义为在main中的局部变量

    //lambda表达式的变量捕获
    //变量捕获是lambda表达式的一种匿名内部类的一个语法规则
    //lambda isQuit和lambda定义在一个作用域中，此时lambda内部，是可以访问到
    //是可以访问到lambda外部（lambda同一个作用域下的）变量的

    //Java把同作用域下的变量都给捕获了
    //但是要求捕获的变量必须为final/事实final
    //没有final但是没有任何修改的也可以
    private static boolean isQuit=false;
    //此处把isQuit定义为一个外部类成员变量  内部类本身就能访问外部类的成员变量
    //而一个内部类去访问外部类的变量本身就是合理的，就不会再有变量捕获这一个限制了
    public static void main(String[] args) throws InterruptedException {
        //boolean isQuit=false;
        Thread t=new Thread(()  ->{
            while(!isQuit){
                System.out.println("hello thread");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("t线程执行结束.");
        });

        t.start();
        Thread.sleep(2000);
        System.out.println("main 线程尝试终止t线程");

        //通过修改isQuit变量，就能影响到t线程的状态
        isQuit=true;
    }
}
